
#ifndef _COMMON_H_
#define _COMMON_H_

#include <stdio.h>          // 标准输入输出
#include <stdint.h>         // 几种扩展的整数类型和宏
#include <stdlib.h>         // 标准函数库
#include <string.h>         // 字符串处理(操作字符数组)
#include "ohos_init.h"          // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h"          // CMSIS-RTOS API V2


// 定义一系列宏，用于标识SSID、密码、MQTT服务器IP地址等，请根据实际情况修改
#define PARAM_HOTSPOT_SSID                  "Xiaobuding" // AP名称
#define PARAM_HOTSPOT_PSK                   "tian20181129"      // AP密码
// #define PARAM_SERVER_ADDR                   "192.168.8.8"    // MQTT服务器IP地址
// #define PARAM_SERVER_PORT                   "1883"           // MQTT服务器端口


// 定义一个宏，用于标识要使用的I2C总线编号是I2C1
#define AHT20_I2C_IDX 1

// 定义一个宏，用于标识上电启动时间（20ms）
#define AHT20_STARTUP_TIME     20*1000

// 定义一个宏，用于标识初始化（校准）时间（40ms）
#define AHT20_CALIBRATION_TIME 40*1000

// 定义一个宏，用于标识测量时间（75ms）
#define AHT20_MEASURE_TIME     75*1000

// 定义一个宏，用于标识AHT20数字温湿度传感器的设备地址（0x38）
#define AHT20_DEVICE_ADDR   0x38

// 定义一个宏，用于标识AHT20数字温湿度传感器的读地址（0x71）
// #define AHT20_READ_ADDR     0x38 //((0x38<<1)|0x1)

// 定义一个宏，用于标识AHT20数字温湿度传感器的写地址（0x70）
// #define AHT20_WRITE_ADDR    0x38 //((0x38<<1)|0x0)

// 定义一个宏，用于标识初始化（校准）命令
#define AHT20_CMD_CALIBRATION       0xBE

// 定义一个宏，用于标识初始化（校准）命令的第1字节参数
#define AHT20_CMD_CALIBRATION_ARG0  0x08

// 定义一个宏，用于标识初始化（校准）命令的第2字节参数
#define AHT20_CMD_CALIBRATION_ARG1  0x00

// 定义一个宏，用于标识触发测量命令
#define AHT20_CMD_TRIGGER       0xAC

// 定义一个宏，用于标识触发测量命令的第1字节参数
#define AHT20_CMD_TRIGGER_ARG0  0x33

// 定义一个宏，用于标识触发测量命令的第2字节参数
#define AHT20_CMD_TRIGGER_ARG1  0x00

// 定义一个宏，用于标识软复位命令
// 用于在无需关闭和再次打开电源的情况下，重新启动传感器系统，软复位所需时间不超过20毫秒
#define AHT20_CMD_RESET      0xBA

// 定义一个宏，用于标识获取状态命令
#define AHT20_CMD_STATUS     0x71

// 获取状态命令的回复有两种情况：
// 1. 初始化后触发测量之前，STATUS 只回复 1B 状态值；
// 2. 触发测量之后，STATUS 回复6B： 1B 状态值 + 2B 湿度 + 4b湿度 + 4b温度 + 2B 温度
//      RH = Srh / 2^20 * 100%
//      T  = St  / 2^20 * 200 - 50

// 1字节状态值：bit[7] 忙闲指示位

// 定义一个宏，用于标识忙闲指示位掩码的左移位数
#define AHT20_STATUS_BUSY_SHIFT 7

// 定义一个宏，用于标识忙闲指示位的掩码
#define AHT20_STATUS_BUSY_MASK  (0x1<<AHT20_STATUS_BUSY_SHIFT)

// 定义一个宏，用于标识忙闲指示位的值
#define AHT20_STATUS_BUSY(status) ((status & AHT20_STATUS_BUSY_MASK) >> AHT20_STATUS_BUSY_SHIFT)

// 1字节状态值：bit[6:5] 工作模式位

// 定义一个宏，用于标识当前工作模式位掩码的左移位数
#define AHT20_STATUS_MODE_SHIFT 5

// 定义一个宏，用于标识当前工作模式位的掩码
#define AHT20_STATUS_MODE_MASK  (0x3<<AHT20_STATUS_MODE_SHIFT)

// 定义一个宏，用于标识当前工作模式位的值
#define AHT20_STATUS_MODE(status) ((status & AHT20_STATUS_MODE_MASK) >> AHT20_STATUS_MODE_SHIFT)

// 1字节状态值：bit[4] 保留位

// 1字节状态值：bit[3] 校准使能位

// 定义一个宏，用于标识校准使能位掩码的左移位数
#define AHT20_STATUS_CALI_SHIFT 3

// 定义一个宏，用于标识校准使能位的掩码
#define AHT20_STATUS_CALI_MASK  (0x1<<AHT20_STATUS_CALI_SHIFT)

// 定义一个宏，用于标识校准使能位的值
#define AHT20_STATUS_CALI(status) ((status & AHT20_STATUS_CALI_MASK) >> AHT20_STATUS_CALI_SHIFT)

// 1字节状态值：bit[2:0] 保留位

// 定义一个宏，用于标识测量结果的长度（6字节）
#define AHT20_STATUS_RESPONSE_MAX 6

// 定义一个宏，用于标识温湿度值计算公式中的2^20
#define AHT20_RESLUTION            (1<<20)  // 2^20

// 定义一个宏，用于标识接收测量结果的重试次数
#define AHT20_MAX_RETRY 10






#define CFG_EN_OLED_DISP                                    1


#if CHIP_WS63
#define AHT20_BAUDRATE (400 * 1000)
#define AHT20_I2C_IDX 1
#else
#define AHT20_BAUDRATE (400 * 1000)
#define AHT20_I2C_IDX 0
#endif


#if CHIP_WS63
#define OLED_I2C_IDX 1
#else
#define OLED_I2C_IDX 0
#endif

#define OLED_WIDTH    (128)

#if CHIP_WS63
#define OLED_I2C_ADDR 0x3C
#else
// 默认地址为 0x78
#define OLED_I2C_ADDR 0x78
#endif

#define OLED_I2C_CMD 0x00 // 0000 0000       写命令
#define OLED_I2C_DATA 0x40 // 0100 0000(0x40) 写数据
#define OLED_I2C_BAUDRATE (400 * 1000) // 400k

#define DELAY_100_MS (100 * 1000)


#define I2C_MASTER_ADDR 0x0
#define I2C_SLAVE_ADDR 0x38
#define I2C_SET_BANDRATE 400000
#define I2C_TASK_STACK_SIZE 0x1000
#define I2C_TASK_PRIO 17


typedef struct {
    /** Pointer to the buffer storing data to send */
    unsigned char *sendBuf;
    /** Length of data to send */
    unsigned int  sendLen;
    /** Pointer to the buffer for storing data to receive */
    unsigned char *receiveBuf;
    /** Length of data received */
    unsigned int  receiveLen;
} IotI2cData;


// 定义一个Log，用于输出日志
#define LOGI(fmt, ...) osal_printk("[%d] %s " fmt "\n", osKernelGetTickCount(), osThreadGetName(osThreadGetId()), ##__VA_ARGS__)

#define DebugMsg(fmt, ...)                      osal_printk(fmt, ##__VA_ARGS__)
#define DebugInfo(fmt, ...)                     osal_printk(fmt, ##__VA_ARGS__)
#define DebugErr(fmt, ...)                      osal_printk(fmt, ##__VA_ARGS__)

void Debug_DataBuff(const uint8_t* head, const uint8_t* buff, uint16_t size);

void initOled(void);
void connectWifi(void);
void waitIpaddrStatus(void);

void readAht20TempHumiValue(void);

void SystemCntTickHandler(void);

#endif 
